// 箭头函数

// 之前

{
    function hello(){
        console.log("say hello");
    }
    hello()
}
    // 或
let hello=function(){
    console.log("say hello");
}
hello()

let hello1=(name)=>{
    console.log("say hello",name);
}
hello1("zzzzzzz")
// 或者
let hello2=name=>{
    console.log("say hello",name);
}
hello2("zxxxxxx")
// 如果只有一个参数，可以省略括号，如果大于一个参数一定要记得带括号。

// 返回值表达式

// 1.如果返回值是表达式可以省略 return 和 {}
let pow=x=>x*x
console.log(pow(2));

// 2.如果返回值是字面量对象，一定要用小括号包起来

let person=(name)=>({
    age:28,
    addr:"cczzssss"
})
console.log(person());

// 拓展

// 普通函数和箭头函数对 this 的处理方式是截然不同的

// 普通函数
let foo={
    name:"es",
    say:function(){
        console.log(this.name);
    }
}
foo.say();//es

// 箭头函数

let foo1={
    name:"es",
    say:()=>{
        console.log(this.name);
    }
}
foo1.say()//undefined

// 为什么结果是 undefined 呢？这是因为箭头函数中对 this 的处理是定义时，this 的指向也就是 foo 外层的所指向的 window，此时由于 window 没有 name 属性，所以结果是 undefined


// this的本质： 创建好的对象的地址

//   this的本质就是“创建好的对象的地址”，由于在构造方法调用之前，对象已经创建好了，因此在构造方法中也可以使和this来代表当前对象

// 1、分配对象空间，并将对象成员变量初始化。
// 2、执行属性值的显式初始化。
// 3、执行构造方法。
// 4、返回相关的地址给相关的对象。

// https://www.cnblogs.com/FrostBoy/p/12364350.html

// 深拷贝和浅拷贝

// 深拷贝出来的对象就是完完全全的新对象，不管是对象本身(id)，还是对象中包含的子对象，都和原始对象不一样；

// 浅拷贝出来的对象就是外新内旧的对象，对象本身(id)和原始对象完全不同，但是子对象和原始对象的子对象是一样的。

